home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 6 / FM Towns Free Software Collection 6.iso / ms_dos / txf / src / txfex_p.c < prev    next >
C/C++ Source or Header  |  1993-07-08  |  4KB  |  174 lines

  1. /***************
  2. *
  3. * g:\exe\txf\src\txfex_p.c
  4. */
  5. #include "txf.h"
  6.  
  7. void exchange(char *oldfile,char *newfile)
  8. {                /* old→new    */
  9.     FILE *tmpin, *tmpout;
  10.     int i = 0, j, clum = 0, knj = 0;
  11.     int sameflg = -1, diff = 0, maxlen = 0, chr = NUL, chrattr = CT_ANK;
  12.     unsigned long int extime = 0;
  13.     char *form = NULL, *tmpbuf;
  14.  
  15.     for (i = 0; i < exflg; i++) {
  16.         form = malloc(strlen(exold[i]) + 1);
  17.         if (form == NULL) {
  18.             errexit("cannot use enough memory(old)");
  19.         }
  20.         strcpy(form, exold[i]);
  21.         /* free(exold[i]); */
  22.         exold[i] = ftrans(form);
  23.         free(form);
  24.         if (maxlen < strlen(exold[i])) {
  25.             maxlen = strlen(exold[i]);
  26.         }
  27.         exattr[i] = malloc(strlen(exold[i]) + 1);
  28.         if (exattr[i] == NULL) {
  29.             errexit("cannot use enough memory(ex_attr)");
  30.         }
  31.         for (j = 0; *(exold[i] + j) != NUL; j++) {
  32.             chrattr = chkctype(*(exold[i] + j), chrattr);
  33.             *(exattr[i] + j) = chrattr;
  34.         }
  35.         if (exnew[i] != NULL) {
  36.             form = malloc(strlen(exnew[i]) + 1);
  37.             if (form == NULL) {
  38.                 errexit("cannot use enough memory(new)");
  39.             }
  40.             strcpy(form, exnew[i]);
  41.             /* free(exnew[i]); */
  42.             exnew[i] = ftrans(form);
  43.             free(form);
  44.         }
  45.     }
  46.     tmpbuf = calloc(maxlen + 1, 1);
  47.  
  48.     if (*oldfile != NUL) {
  49.         tmpin=fopen(oldfile,"rb");
  50.     }
  51.     else {
  52.         tmpin=stdin;
  53.     }
  54.     tmpout = fopen(newfile, "wb");
  55.     if (viewmode > 2) {
  56.         fprintf(stderr,"Info:readfile=%s,(%d)/writefile=%s,(%d)\n",
  57.             oldfile, tmpin, newfile, tmpout);
  58.     }
  59.     if ((tmpin == NULL) || (tmpout == NULL)) {
  60.         errexit("cannot open TMP/input file(exchange-P)\n");
  61.     }
  62.     for (j = 0; j < exflg; j++) {
  63.         exptr[j] = exold[j];
  64.         exattrptr[j] = exattr[j];
  65.     }
  66.  
  67.     i = 0;
  68.     chrattr = CT_ANK;
  69.     while (chr != EOF) {
  70.         sameflg =- 1;
  71.         while (sameflg == -1) {
  72.             chr = getc(tmpin);
  73.             if (chr == RET) {
  74.                 clum = 0;
  75.                 quote = 0;
  76.             }
  77.             else {
  78.                 clum++;
  79.             }
  80.             if (knj > 0) {
  81.                 if ((clum == 2) && (jstrchr(kq, chr | knj<<8) != NULL)) {
  82.                     quote = 1;
  83.                 }
  84.             }
  85.             else {
  86.                 if ((clum == 1) && (jstrchr(kq, (chr & 0x0ff)) != NULL)) {
  87.                     quote=1;
  88.                 }
  89.             }
  90.             chrattr = chkctype(chr, chrattr);
  91.             if (chrattr == CT_KJ1) {
  92.                 knj = chr;
  93.             }
  94.             else {
  95.                 knj = 0;
  96.             }
  97.             diff = 0;
  98.             for (j = 0; j < exflg; j++) {
  99.                 if ((chr == *(exptr[j])) && (chrattr == *(exattrptr[j]))
  100.                                             && !(quote & quoteflg)) {
  101.                     exptr[j] += 1;
  102.                     exattrptr[j] += 1;
  103.                     if (*exptr[j] == NUL) {
  104.                         sameflg = j;
  105.                     }
  106.                 }
  107.                 else {
  108.                     if (exold[j] != exptr[j]) {
  109.                         exptr[j] = exold[j];
  110.                         exattrptr[j] = exattr[j];
  111.                     }
  112.                     diff ++;
  113.                 }
  114.             }
  115.             if ((sameflg == -1) && (chr != EOF)) {
  116.                 if (diff < exflg) { 
  117.                     *(tmpbuf+i) = chr;
  118.                     i++;
  119.                     *(tmpbuf+i) = NUL;
  120.                 }
  121.                 else {
  122.                     if (i > 0) {
  123.                         fwrite(tmpbuf,1,i,tmpout);
  124.                     }
  125.                     putc(chr, tmpout);
  126.                     i = 0;
  127.                 }
  128.             }
  129.             if (chr == EOF) break;
  130.         }
  131.         if (sameflg != -1) {
  132.             if (exnew[sameflg] != NUL) {
  133.                 fwrite(exnew[sameflg], 1, strlen(exnew[sameflg]), tmpout);
  134.             }
  135.             exptr[sameflg] = exold[sameflg];
  136.             exattrptr[sameflg] = exattr[sameflg];
  137.             i = 0;
  138.             extime++;
  139.             if (viewmode > 1) fprintf(stderr, "%ld%c", extime, 0x0d);
  140.         }
  141.         else {
  142.             fwrite(tmpbuf,1,i,tmpout);
  143.         }
  144.         i=0;
  145.     }
  146.     if (viewmode>0) {
  147.         fprintf(stderr, "%ldtime(s) exchanged!\n", extime);
  148.     }
  149.  
  150.     fclose(tmpin);
  151.     fclose(tmpout);
  152.     free(tmpbuf);
  153.     for (j = 0; j < exflg; j++) {
  154.         free(exattr[j]);
  155.     }
  156. }
  157.  
  158. void exchangedriver()
  159. {
  160. char *tmpinname, *tmpoutname;
  161.     tmpinname = ((tmpinfile == -1) ? inputfile : tfile[tmpinfile]);
  162.     tmpoutname = tfile[((tmpinfile > 0) ? 0 : 1)];
  163.     if (viewmode > 0)
  164.         fprintf(stderr, "TXF Super exchange module.(Parallel) Ver2.01b\n");
  165.  
  166.     if (exold[0] != NULL) {
  167.         exchange(tmpinname, tmpoutname);
  168.     }
  169.     tmpinfile = ((tmpinfile > 0) ? 0 : 1);
  170.     tmpinname = tfile[tmpinfile];
  171.     tmpoutname = tfile[1 - tmpinfile];
  172.  
  173. }
  174.